home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 208_01 / e9.c < prev    next >
Text File  |  1987-10-11  |  4KB  |  140 lines

  1. /*
  2. HEADER:        CUG208;
  3. TITLE:        'e' for CP/M68K
  4. VERSION:    1.48b
  5.  
  6. DESCRIPTION:    "a screen editor";
  7.  
  8. KEYWORDS:    editor;
  9. SYSTEM:        CP/M68K, V1.2;
  10. FILENAME:    e/e9.c
  11. WARNINGS:    "the default value is for systems with 128K bytes
  12.          of memory or more";
  13. SEE-ALSO:    cpm68k.c, e68k.doc, CUG VOL 133;
  14. AUTHORS:    G.N.Gilbert('e'), J.W.Haefner(for DeSmet C on MSDOS and UNIX)
  15. CODER:        Yoshimasa Tsuji
  16. COMPILERS:    DRI C(Alcyon C) for CP/M68K;
  17. */
  18. /*
  19.         FUNCTIONS: initvm,freememslot,swapout,writepage,swappin,readpage,
  20.                         fatalerror
  21. */
  22.  
  23. #include "e.h"
  24. #include <setjmp.h>
  25.  
  26. extern jmp_buf mainmenu;
  27.  
  28. extern char *mktemp();
  29. extern long lseek();
  30.  
  31. char pagemem[MAXMEMSLOTS*PAGESIZE];
  32.  
  33. initvm()        /*initialise virtual memory system*/
  34. {
  35.     register int slot;
  36.     register char *base;
  37.  
  38.     slotsinmem=MAXMEMSLOTS;
  39.     for(slot=0, base=pagemem;slot <slotsinmem;slot++, base += PAGESIZE) {
  40.         usage[slot]= FREE;
  41.         slotaddr[slot]= base;
  42.     }
  43.     clock=0;
  44.     /*slot 0 for tp*/
  45.     tp = (struct addr *)pagemem;
  46.     tppages=1;
  47.     usage[0]= NOTAVAIL;
  48.  
  49.     /*force balloc to find a new page to start*/
  50.     pageloc[(newpage=0)]=FREE;
  51.     allocp=PAGESIZE+1;
  52.  
  53.     /*paging file not yet created*/
  54.     pagefd= NOFILE;
  55.     strcpy(pagingfile,(*pagingdir ? pagingdir:curdir) );
  56.     strcat(pagingfile,":");
  57.     strcat(pagingfile,mktemp("eXXXXXX"));
  58. }
  59.  
  60. freememslot()   /*returns the number of a free memory slot, possibly by swapping
  61.                   out the least recently used page currently in memory*/
  62. {
  63.     register int use, u;
  64.     register int i, slot;
  65.  
  66.     for (use=MAXINT, i=0; use && i < slotsinmem; i++)
  67.         if ( (u=usage[i]) != NOTAVAIL && u < use)
  68.             use=u, slot=i;
  69.     if (use) /*no free slots*/ swapout(slot);
  70.     return(slot);
  71. }
  72.  
  73. swapout(slot)   /*swaps page currently in memory at 'slot' to disk,
  74.                   updating pageloc to show new location*/
  75. {
  76.     register int *pl;
  77.  
  78.     /*find page number of page at 'slot'*/
  79.     for (pl= pageloc; *pl != slot; pl++);
  80.     *pl = -writepage(slot);/*update pageloc with disk slot written to*/
  81.     /*pageloc[] contains positive int when in main memory, negative
  82.      *when in disk
  83.      */
  84. }
  85.  
  86. writepage(slot) /*writes page currently in memory at 'slot' to disk;
  87.                   returns disk slot where written*/
  88. {
  89.     register int loc;
  90.     register long sekbytes;
  91.  
  92.     if (pagefd == NOFILE) { /*haven't opened paging file yet*/
  93.         checkkey();
  94.         if ((pagefd=creat(pagingfile,0644)) == FAIL)
  95.             fatalerror("Can't create a buffer file");
  96.         for (loc=0; loc < MAXSLOTS; loc++) dskslots[loc]=FREE;
  97.     }
  98.     for (loc=0; dskslots[loc] != FREE; loc++); /*find a free slot*/
  99.     sekbytes= (long)loc*(long)PAGESIZE;
  100.     if (lseek(pagefd,sekbytes,0) == FAIL)
  101.         fatalerror("Bad seek in writing buffer");
  102.     checkkey();
  103.     if (write(pagefd,slotaddr[slot],PAGESIZE) != PAGESIZE)
  104.         fatalerror("Can't write to buffer - disk full");
  105.     dskslots[loc]= INUSE;
  106.     usage[slot]= FREE;
  107.     return(loc);
  108. }
  109.  
  110. swappin(page)   /*get 'page', currently on disk, into memory and return slot
  111.                   where placed*/
  112. int page;
  113. {
  114.     register int slot;
  115.     readpage( (slot=freememslot()), -pageloc[page]);
  116.     usage[slot]= INUSE;
  117.     return(pageloc[page]=slot);
  118. }
  119.  
  120. readpage(memslot,dskslot)       /*read a page from disk into memory at 'memslot'*/
  121. register int memslot, dskslot;
  122. {
  123. register long sekbytes;
  124.     sekbytes= (long)dskslot*(long)PAGESIZE;
  125.     if (lseek(pagefd,sekbytes,0) == FAIL)
  126.         fatalerror("Bad seek in reading buffer");
  127.     checkkey();
  128.     if (read(pagefd,slotaddr[memslot],PAGESIZE) != PAGESIZE)
  129.         fatalerror("Can't read buffer");
  130.     dskslots[dskslot]= FREE;
  131. }
  132.  
  133. fatalerror(message)     /*displays message, returns to a known good screen*/
  134. char *message;
  135. {
  136.     error(message);
  137.     moveline(goodline-cline);
  138.     longjmp(mainmenu,1);
  139. }
  140.